package com.java.test1;

import org.junit.Test;

/**
 * 关于StringBuffer和StringBuilder的使用
 *
 * @author shkstart
 * @create 2021-01-05 23:21
 */
public class StringBufferBuilderTest {
    /*
     * String StringBuffer和StringBuilder三者的异同？
     * String：不可变的字符序列   底层使用char[]数组存储的
     * StringBuffer:可变的字符序列  线程安全的  缺点效率偏低 底层使用char[]数组存储的
     * StringBuilder:可变的字符序列 JDK5.0新增的  线程不安全的   效率高  底层使用char[]数组存储的
     *
     * 源码分析：
     * String s1=new String();   char[] value=new char[0]
     * String s2=new String("abc")  char[] value=new char[]{a,b,c}
     *
     * StringBuffer sb1=new StringBuffer()   char[] value=new char[16] 底层创建了一个长度为16的char型数组
     * System.out.println(sb1.length);   //0
     * sb1.append('a');  value[0]='a';
     * sb1.append('b');  value[1]='b';
     *
     * StringBuffer sb2=new StringBuffer("abc")  char[] value=new char[sb2.length+16]
     *
     * 问题一：System.out.println(sb2.length);    3
     * 问题二：扩容问题：如果要添加的数据底层数组盛不下了，那就需要扩容底层的数组
     *       默认情况下：扩容为原来容量的两倍+2  同时将原有数组的元素复制到新的数组中
     *
     *       指导意见：开发中建议使用StringBuffer(int capacity)和StringBuilder(int capacity)
     *
     * */


    /*
     * StringBuffer的常用方法：
     *StringBuffer append(xxx):提供了很多的Append（）方法，用于进行字符串拼接
     * StringBuffer delete(int start,int end)：删除指定位置的内容
     * StringBuffer replace(int start,int end,String str)：把[start，end]位置的字符串更换为str
     * StringBuffer insert(int offset,xxx)：在指定位置插入xxx
     * StringBuffer reverse():把当前字符序列逆转
     * public int indexOf(String str)：
     * public String subString(int start,int end)
     * public int length()
     * public char charAt(int n)
     * public void setCharAt(int n,char ch)
     *
     *
     *
     * 总结：
     *   增：append(xxx)
     *   删：delete(int start,int end)
     *   改：replace(int start,int end,StringBuffer str)   setCharAt(int n,char ch)
     *   查：charAt(int n)
     *   插：insert(int start,xxx)
     *   遍历：for+charAt()/toString()
     *   长度：.length
     *
     * */


    /**
     * String、StringBuffer、StringBuilder三者的效率对比
     * 从高到低排列： StringBuilder-->StringBuffer--->String
     */
    @Test
    public void test1() {
        StringBuffer s1 = new StringBuffer("陆志坤存款为：");
        s1.append(30);                          //连接/添加
        s1.append(200);
        System.out.println(s1);
        s1.delete(2, 4);     //左闭右开              删除
        System.out.println(s1);
        char a = s1.charAt(3);
        System.out.println(a);

        s1.replace(0, 3, "liniu");   //替换
        System.out.println(s1);

        s1.insert(5, "love");        //插入
        System.out.println(s1);

        StringBuffer s2 = new StringBuffer("12345");
        s2.reverse();               //逆转
        System.out.println(s2);

        char c = s2.charAt(2);        //查询
        System.out.println(c);

    }

}
